#include "work1.h" 
#include "usartHelper.h" 
#include  "usart.h"
#include  "string.h"
//#include  "stdio.h"
#include "led.h"
/*******************************************************************************
* 函 数 名         : work1_dateDeal
* 函数功能		     : 串口1数据处理函数 
* 输    入         : 
*                    len    数组长度
*                    data   数据数组
* 输    出         : 无
*******************************************************************************/ 
void work1_dateDeal(u16 len, u8 data[])
{ 
  int checkSum,i,gpio_byte;
	u8 addrId;              // 地址域，设备ID
	u8 ctrlId;              // 控制域，控制指令
	u8 countId;             // 帧号
	u8 countIdS;            // 总帧长度
	u8 lenN=len-12;     // 目标数据内容长度
	u8 dataN[lenN];         // 目标数据内容缓存
	  
  if(len < 12 || len > 255)
	 {
		 sandLog(1,"[ERROR]: data length");
		 	return;
	 }
	else if (data[0]!=0xaa || data[1] !=0xbb)
	 {
		 sandLog(1,"[ERROR]: data head");
		 	return;
		
	 }
	else if(data[len-2]!=0xcc || data[len-1]!=0xdd)
	 {
		 sandLog(1,"[ERROR]: data last");
		 	return;
	 }
	 
		// 计算校验和 
	  checkSum = 0;
	 for( i = 0; i < len-3 ; i++)
	 {
		  checkSum = (checkSum + data[i]);
	 }
	 checkSum = checkSum % 0xff;
	 if( checkSum != data[len-3])
	  { 
			u8 data2[3] = {checkSum, data[len-4], data[len-3]};
			sendDatas(USART1, 3, data2);
			sandLog(1,"[ERROR]: check sum");
		 	return;
	  }
   else if(data[6] != lenN)
	 { 
		 sandLog(1,"[ERROR]: data leng check");
		 return;
	 }
	 
	 addrId  = data[2];
	 ctrlId  = data[3];                  // 控制指令 
	 countId = data[4] << 8 | data[5];   // 帧号， 注意一下大小端问题  
	 countIdS = data[len - 5] << 8 | data[len - 4]; // 总帧数
	    
	 // 提取目标数据 
	 for(i = 0 ; i< lenN ; i++)
	 {
		  dataN[i] = data[i + 6];
	 }
	
//    
//	 // 任务处理============================================
	   if(ctrlId == 0x21)
	 {  // 控制引脚
		 int gpio = dataN[0];    // 引脚号
		 int gpio_byte= dataN[1];//引脚位号
	   int d    = dataN[2];// 高低电平
		 if(d==0)
		 {
			 GPIO_ResetBits(LED0_PORT,gpio);
		 }
		 else
		 {
			 GPIO_ResetBits(LED0_PORT,gpio);
		 }
	 }
	 
	  sandLog(1,"suessed");
	  
	 
}	 	 

/*******************************************************************************
* 函 数 名         : sandLog
* 函数功能		     : 发送日志-数组
* 输    入         : id 端口id 
* data             ：数据数组
* 输    出         : 无
*******************************************************************************/ 

void sandLog(u8 id, char* data)
{  
	 u8 end;
	 u8 start=0;
	 u8  batch[end - start];
	 u16 len = string_length(data);
	 if(len < 250)
	 { 
		 dataPackage(len, (u8 *)data, id, 0x01, 1, 1);
	 }
	 else
	 {
		 // 有1099棵树，每行栽250棵，要栽几行；
		 u8   countId = 0;  // 当前第几行；
		 u8   countIdS,i;// 总行数；
		 countIdS = len/255;
		if(len % 255 > 0)
		{
			countIdS++;
		}                               // 发送数据批次；
    while (start < len) 
			{
			  
        end = start + 255;
                             // 如果end超过总数据量，则将其设置为总数据量；
        if (end > len) 
				{
            end = len ;
        }
        
        // 提取当前批次的数据；
        //  int  batch[end - start];
        for (i = start; i < end; i++) 
				{
            batch[i - start] = data[i];
        }
        // 发送当前批次的数据；
         dataPackage(len,(u8*)batch, id, 0x01,countId, countIdS);
        
        // 更新开始位置，准备下一批；
        start = end;
    }
  }
}  
